package com.example.myapplication01.chapter06.database;

import android.content.ContentValues; // 导入ContentValues类
import android.content.Context; // 导入Context类
import android.database.Cursor; // 导入Cursor类
import android.database.sqlite.SQLiteDatabase; // 导入SQLiteDatabase类
import android.database.sqlite.SQLiteOpenHelper; // 导入SQLiteOpenHelper类

import com.example.myapplication01.chapter06.enity.User;

import java.util.ArrayList; // 导入ArrayList类
import java.util.List; // 导入List类

public class UserDBHelper extends SQLiteOpenHelper { // 定义UserDBHelper类，继承SQLiteOpenHelper

    private static final String DB_NAME = "user.db"; // 数据库名称
    private static final String TABLE_NAME = "user_info"; // 表名称
    private static final int DB_VERSION = 2; // 数据库版本
    private static UserDBHelper mHelper = null; // UserDBHelper实例
    private SQLiteDatabase mRDB = null; // 读数据库实例
    private SQLiteDatabase mWDB = null; // 写数据库实例

    private UserDBHelper(Context context) { // 构造函数
        super(context, DB_NAME, null, DB_VERSION); // 调用父类构造函数
    }

    // 利用单例模式获取数据库帮助器的唯一实例
    public static UserDBHelper getInstance(Context context) { // 获取UserDBHelper实例
        if (mHelper == null) { // 如果实例为空
            mHelper = new UserDBHelper(context); // 创建新的UserDBHelper实例
        }
        return mHelper; // 返回实例
    }

    // 打开数据库的读连接
    public SQLiteDatabase openReadLink() { // 打开读连接
        if (mRDB == null || !mRDB.isOpen()) { // 如果读数据库实例为空或未打开
            mRDB = mHelper.getReadableDatabase(); // 获取可读数据库
        }
        return mRDB; // 返回读数据库实例
    }

    // 打开数据库的写连接
    public SQLiteDatabase openWriteLink() { // 打开写连接
        if (mWDB == null || !mWDB.isOpen()) { // 如果写数据库实例为空或未打开
            mWDB = mHelper.getWritableDatabase(); // 获取可写数据库
        }
        return mWDB; // 返回写数据库实例
    }

    // 关闭数据库连接
    public void closeLink() { // 关闭数据库连接
        if (mRDB != null && mRDB.isOpen()) { // 如果读数据库实例不为空且已打开
            mRDB.close(); // 关闭读数据库
            mRDB = null; // 将读数据库实例置为空
        }

        if (mWDB != null && mWDB.isOpen()) { // 如果写数据库实例不为空且已打开
            mWDB.close(); // 关闭写数据库
            mWDB = null; // 将写数据库实例置为空
        }
    }

    // 创建数据库，执行建表语句
    @Override
    public void onCreate(SQLiteDatabase db) { // 创建数据库
        String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" + // 创建表的SQL语句
                "_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + // 定义_id字段
                " name VARCHAR NOT NULL," + // 定义name字段
                " age INTEGER NOT NULL," + // 定义age字段
                " height LONG NOT NULL," + // 定义height字段
                " weight FLOAT NOT NULL," + // 定义weight字段
                " married INTEGER NOT NULL);"; // 定义married字段
        db.execSQL(sql); // 执行SQL语句
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 升级数据库
        String sql = "ALTER TABLE " + TABLE_NAME + " ADD COLUMN phone VARCHAR;"; // 添加phone字段的SQL语句
        db.execSQL(sql); // 执行SQL语句
        sql = "ALTER TABLE " + TABLE_NAME + " ADD COLUMN password VARCHAR;"; // 添加password字段的SQL语句
        db.execSQL(sql); // 执行SQL语句
    }

    public long insert(User user) { // 插入用户数据
        ContentValues values = new ContentValues(); // 创建ContentValues对象
        values.put("name", user.name); // 插入name字段
        values.put("age", user.age); // 插入age字段
        values.put("height", user.height); // 插入height字段
        values.put("weight", user.weight); // 插入weight字段
        values.put("married", user.married); // 插入married字段

        try {
            mWDB.beginTransaction(); // 开始事务
            mWDB.insert(TABLE_NAME, null, values); // 插入数据
            mWDB.setTransactionSuccessful(); // 设置事务成功
        } catch (Exception e) { // 捕获异常
            e.printStackTrace(); // 打印异常信息
        } finally {
            mWDB.endTransaction(); // 结束事务
        }

        return 1; // 返回插入结果
    }

    public long deleteByName(String name) { // 根据名称删除用户数据
        return mWDB.delete(TABLE_NAME, "name=?", new String[]{name}); // 执行删除操作
    }

    public long update(User user) { // 更新用户数据
        ContentValues values = new ContentValues(); // 创建ContentValues对象
        values.put("name", user.name); // 更新name字段
        values.put("age", user.age); // 更新age字段
        values.put("height", user.height); // 更新height字段
        values.put("weight", user.weight); // 更新weight字段
        values.put("married", user.married); // 更新married字段
        return mWDB.update(TABLE_NAME, values, "name=?", new String[]{user.name}); // 执行更新操作
    }

    public List<User> queryAll() { // 查询所有用户数据
        List<User> list = new ArrayList<>(); // 创建用户列表
        Cursor cursor = mRDB.query(TABLE_NAME, null, null, null, null, null, null); // 查询数据
        while (cursor.moveToNext()) { // 遍历查询结果
            User user = new User(); // 创建User对象
            user.id = cursor.getInt(0); // 获取_id字段
            user.name = cursor.getString(1); // 获取name字段
            user.age = cursor.getInt(2); // 获取age字段
            user.height = cursor.getLong(3); // 获取height字段
            user.weight = cursor.getFloat(4); // 获取weight字段
            user.married = (cursor.getInt(5) == 0) ? false : true; // 获取married字段
            list.add(user); // 将用户添加到列表
        }
        return list; // 返回用户列表
    }

    public List<User> queryByName(String name) { // 根据名称查询用户数据
        List<User> list = new ArrayList<>(); // 创建用户列表
        Cursor cursor = mRDB.query(TABLE_NAME, null, "name=?", new String[]{name}, null, null, null); // 查询数据
        while (cursor.moveToNext()) { // 遍历查询结果
            User user = new User(); // 创建User对象
            user.id = cursor.getInt(0); // 获取_id字段
            user.name = cursor.getString(1); // 获取name字段
            user.age = cursor.getInt(2); // 获取age字段
            user.height = cursor.getLong(3); // 获取height字段
            user.weight = cursor.getFloat(4); // 获取weight字段
            user.married = (cursor.getInt(5) == 0) ? false : true; // 获取married字段
            list.add(user); // 将用户添加到列表
        }
        return list; // 返回用户列表
    }
}